package ThreadTest;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class test1 {
    public static final ExecutorService executer = Executors.newFixedThreadPool(10);

    /**
     * 线程池七大参数
     * corePoolSize：核心线程数，线程池创建好以后就准备就绪的线程数量，一直存在，等待接收执行异步任务（设置allowCoreThreadTimeOut属性超时后会回收）
     * maximumPoolSize：最大线程数量，控制资源并发
     * keepAliveTime：存活时间，如果当前线程数量大于核心数量，当线程空闲时间大于指定的时间，释放空闲的线程(maximumPoolSize-corePoolSize)
     * unit：时间单位
     * BlockingQueue<Runnable> workQueue：阻塞队列，如果任务有很多，就会将当前多出的任务放在队列中，只要有线程空闲就会取出新的任务
     * ThreadFactory threadFactory：创建线程的工厂
     * RejectedExecutionHandler handler：拒绝策略，如果队列满了，按照指定的策略来处理多余的任务
     * <p>
     * 工作顺序：
     * 1.创建线程池，准备好corePoolSize数量的核心线程数准备执行任务，
     * 2.新的任务进来，用core准备好的空闲线程执行
     * 2.1.如果core满了，就将再进来的任务放入阻塞队列中，空闲的core就会自己去阻塞队列获取任务
     * 2.2.阻塞队列满了，就直接开启新的线程执行任务，最大只能开到max指定的数量
     * 2.3.max都执行好了，Max减core数量的线程会在keepAliveTime指定的时间后自动销毁，最终保持到core大小
     * 2.4.如果线程数开到了max的数量，还要新的任务进来，就会使用handler指定的拒绝策略进行处理
     * 3.所有的线程创建都是由threadFactory 线程工厂创建
     */

    /**
     * CompletableFuture (类似前端的promise)
     */

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("start");
        /*CompletableFuture.runAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
        }, executer);*/
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            System.out.println("当前线程:" + Thread.currentThread().getId());
            int i = 10 / 2;
            //int i = 10 /0;
            return i;
        }, executer).whenComplete((res, err) -> {
            //当完成时
            //可以感知异常但是不能修改结果
            System.out.println("res=" + res);
            //System.out.println("err=" + err);
        }).exceptionally((err) -> {
            //处理异常,并返回默认值
            return 10;
        });
        System.out.println("end");
        //System.out.println(future.get());
    }
}